package reflect02;

import org.junit.Test;
import reflect01.Person;

import java.lang.reflect.Method;

/**
 * 反射(解剖出)成员方法信息
 * Class类中的成员方法:
 *  Method getMethod(String name, Class<?>... parameterTypes)
 *           返回一个 Method 对象，它反映此 Class 对象所表示的类或接口的指定公共成员方法。
 * Method类的方法:
 *  Object invoke(Object obj, Object... args)
 *        形参:
 *          Object obj:代表该类的一个对象
 *          args:代表传递给方法的实参
 *        返回值:
 *          代表调用的方法的返回值
 *          如果该方法没有返回值,那么invoke返回null
 */
public class ReflectDemo03 {
	@Test
	public void testMethod01()throws Exception {
		//1.获取字节码对象
		Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");
		//2.获取指定的成员方法
		Method sleepMethod = pCls.getMethod("sleep");

		//3.通过invoke来调用该方法
		Person p = pCls.newInstance();
		System.out.println(sleepMethod.invoke(p));//类似: Person p=new Person();
	                                           	//p.sleep();
	}

	@Test
	public void testMethod02()throws Exception {
		//1.获取字节码对象
		Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");

		//2.获取eat方法
		Method eatMethod = pCls.getMethod("eat", String.class);

		//3.调用eat方法
		Person p = pCls.newInstance();
		Object retrunVal=eatMethod.invoke(p,"榴莲");//相当于:Person p=new Person();
		                                                 //String food = p.eat("蛋糕");
		                                                //System.out.println(food);
		System.out.println(retrunVal);
	}
}
